#include <iostream>
#include <string>

using namespace std;

#define MAX 1024

// 13/3的余数为1，而134/3的余数是14%3=2，即(1*10+4)%3=2
// 继续，1345/3的余数是(2*10+5)%3=1。以此类推

int dp[MAX][MAX]; // dp[i][j]表示字符串前i位表示的数 % n = j的情况数
string num;

int Possible(int n)
{
    if (num[0] == 'X')
    {
        // 首位X不可能是0
        for (int i = 1; i <= 9; i++)
        {
            // 各个余数的可能
            for (int j = 0; j < n; j++)
            {
                if (i % n == j)
                    dp[1][j]++;
            }
        }
    }
    else
    {
        // 如果首位不是X，则初始化dp[1][j]
        int j = (num[0] - '0') % n;
        dp[1][j]++;
    }

    // 下面开始每次加一位长度
    for (int i = 2; i <= num.length(); i++)
    {
        // 上一位长度的余数
        for (int j = 0; j < n; j++)
        {
            if (num[i - 1] == 'X')
            {
                // 非首位可以是0-9
                for (int k = 0; k <= 9; k++)
                {
                    int newj = (10 * j + k) % n; // 前i位的余数
                    dp[i][newj] += dp[i - 1][j]; // 前i位的情况里面包含前i-1位的情况
                }
            }
            else
            {
                int newj = (10 * j + (num[i - 1] - '0')) % n;
                dp[i][newj] += dp[i - 1][j]; // 前i位的情况里面包含前i-1位的情况
            }
        }
    }

    return dp[num.length()][0];
}

int main()
{
    int n;
    while (true)
    {
        memset(dp, 0, sizeof(dp));
        num.clear();
        cout << "请输入模糊的饼干数量K，X表示模糊位：";
        cin >> num;

        cout << "请输入有几个小朋友：";
        cin >> n;

        cout << "平分给" << n << "个小朋友，K有" << Possible(n) << "种可能值" << endl;
    }
}